/**
 * @file    elog_port.c
 * @brief   EasyLogger移植层实现文件
 * @details 本文件提供了EasyLogger移植层接口的参考实现，包括：
 *          - 移植层初始化和反初始化
 *          - 底层日志输出接口实现
 *          - 输出锁定和解锁控制
 *          - 时间信息获取接口
 *          - 进程和线程信息获取接口
 *          
 * @note    本实现包含常见平台的示例代码（STM32/FreeRTOS/RT-Thread等）
 *          用户可根据实际平台进行修改和裁剪
 */

#include "elog.h"
#include <stdio.h>
#include <string.h>

/* ---------------------------------- 平台相关头文件 ------------------------------------ */
/* 根据实际使用的MCU平台，包含对应的头文件 */
/* 示例：STM32系列（用户可根据实际平台修改） */
#if defined(STM32F1)
    #include "stm32f1xx_hal.h"
#elif defined(STM32F4)
    #include "stm32f4xx_hal.h"
#elif defined(STM32F7)
    #include "stm32f7xx_hal.h"
#elif defined(STM32H7)
    #include "stm32h7xx_hal.h"
#elif defined(STM32F0)
    #include "stm32f0xx_hal.h"
#elif defined(STM32L4)
    #include "stm32l4xx_hal.h"
#else
    /* 其他平台：用户需要在此添加对应的头文件 */
    #warning "未定义平台，部分功能可能不可用。请根据实际平台添加头文件"
#endif

/* ---------------------------------- RTOS相关头文件 ------------------------------------- */
/* 根据实际使用的RTOS，包含对应的头文件 */
/* 示例：FreeRTOS、RT-Thread（用户可添加其他RTOS支持） */
#ifdef USING_FREERTOS
    #include "FreeRTOS.h"
    #include "task.h"
#endif

#ifdef USING_RTTHREAD
    #include "rtthread.h"
#endif

/* 其他RTOS示例（用户可取消注释并修改）*/
// #ifdef USING_UCOS
//     #include "os.h"
// #endif

/* ---------------------------------- 移植层初始化 ------------------------------------ */
/**
 * @brief  EasyLogger移植层初始化
 * @return 初始化结果
 * @retval ELOG_NO_ERR 初始化成功
 */
ElogErrCode elog_port_init(void)
{
    ElogErrCode result = ELOG_NO_ERR;                       /* 初始化结果 */

    /* 在此添加硬件相关初始化代码 */
    
    return result;
}

/**
 * @brief  EasyLogger移植层反初始化
 */
void elog_port_deinit(void)
{
    /* 在此添加硬件相关反初始化代码 */
}

/* ---------------------------------- 日志输出接口 ------------------------------------ */
/**
 * @brief  日志输出接口函数
 * @param  log 日志内容指针
 * @param  size 日志内容长度
 */
void elog_port_output(const char *log, size_t size)
{
    /* 在此添加实际的输出代码 */
    printf("%.*s", size, log);                              /* 通过printf输出日志 */
}

/* ----------------------------------- 输出锁控制 ------------------------------------- */
/**
 * @brief  输出锁定函数
 * @note   根据不同的RTOS环境选择对应的锁机制
 */
void elog_port_output_lock(void)
{
#ifdef USING_FREERTOS
    /* FreeRTOS：进入临界区 */
    taskENTER_CRITICAL();
#elif defined(USING_RTTHREAD)
    /* RT-Thread：关闭调度器 */
    rt_enter_critical();
#else
    /* 裸机：关闭全局中断 */
    __disable_irq();
#endif
}

/**
 * @brief  输出解锁函数
 * @note   根据不同的RTOS环境选择对应的解锁机制
 */
void elog_port_output_unlock(void)
{
#ifdef USING_FREERTOS
    /* FreeRTOS：退出临界区 */
    taskEXIT_CRITICAL();
#elif defined(USING_RTTHREAD)
    /* RT-Thread：开启调度器 */
    rt_exit_critical();
#else
    /* 裸机：开启全局中断 */
    __enable_irq();
#endif
}

/* ----------------------------------- 时间信息获取 ----------------------------------- */
/**
 * @brief  获取当前时间字符串
 * @return 时间字符串指针
 * @note   示例使用系统运行时间，格式为 HH:MM:SS
 *         用户可根据需要修改为RTC实时时钟、网络时间等
 */
const char *elog_port_get_time(void)
{
    static char time_str[16] = {0};     /* 静态时间字符串缓冲区 */
    
#if defined(STM32F1) || defined(STM32F4) || defined(STM32F7) || defined(STM32H7) || defined(STM32F0) || defined(STM32L4)
    /* 示例：STM32平台使用HAL_GetTick()获取系统运行时间 */
    uint32_t tick_ms = HAL_GetTick();
    
    /* 转换为秒 */
    uint32_t total_seconds = tick_ms / 1000;
    
    /* 计算时、分、秒 */
    uint32_t hours = (total_seconds / 3600) % 24;    /* 24小时制循环 */
    uint32_t minutes = (total_seconds / 60) % 60;
    uint32_t seconds = total_seconds % 60;
    
    /* 格式化时间字符串 HH:MM:SS */
    snprintf(time_str, sizeof(time_str), "%02lu:%02lu:%02lu", 
             hours, minutes, seconds);
#else
    /* 其他平台：用户需自行实现时间获取 */
    /* 示例：可以使用RTC、系统计数器等 */
    snprintf(time_str, sizeof(time_str), "00:00:00");
#endif
    
    return time_str;
}

/* ----------------------------------- 进程线程信息 ----------------------------------- */
/**
 * @brief  获取当前进程信息
 * @return 进程信息字符串指针
 * @note   示例返回平台标识（STM32F1/F4等）
 *         用户可根据需要修改为：芯片型号、设备ID、应用名称等
 */
const char *elog_port_get_p_info(void)
{
    /* 示例：返回芯片系列标识 */
#if defined(STM32F1)
    return "STM32F1";
#elif defined(STM32F4)
    return "STM32F4";
#elif defined(STM32F7)
    return "STM32F7";
#elif defined(STM32H7)
    return "STM32H7";
#elif defined(STM32F0)
    return "STM32F0";
#elif defined(STM32L4)
    return "STM32L4";
#else
    /* 其他平台：用户需自行定义平台标识 */
    /* 示例：return "ESP32"; return "NXP_K64F"; 等 */
    return "Unknown";
#endif
}

/**
 * @brief  获取当前线程/任务信息
 * @return 线程信息字符串指针
 * @note   根据不同的RTOS环境返回对应的线程/任务名称
 *         用户可根据实际RTOS添加对应实现
 */
const char *elog_port_get_t_info(void)
{
#ifdef USING_FREERTOS
    /* 示例：FreeRTOS环境 - 返回当前任务名 */
    TaskHandle_t current_task = xTaskGetCurrentTaskHandle();
    if (current_task != NULL)
    {
        return pcTaskGetName(current_task);
    }
    return "Unknown";
#elif defined(USING_RTTHREAD)
    /* 示例：RT-Thread环境 - 返回当前线程名 */
    rt_thread_t current_thread = rt_thread_self();
    if (current_thread != RT_NULL)
    {
        return current_thread->name;
    }
    return "Unknown";
#else
    /* 裸机系统：返回固定标识 */
    return "Main";
#endif
}
